PostgerSQL 全文搜索 其他函数和操作符

1 背景知识

本章主要全文搜索的函数和操作符。

2 文档(tsvector)操作符和函数

文档解析介绍了如何将文本文档转换为 tsvector 文档。PostgreSql 提供了更多操作符和函数操作 tsvector 文档。
更多的函数和操作符请见官方文档

2.1 ||

|| 是指连接操作符,tsvector || tsvector 将两个 tsvector 值联合在一起。在连接过程中 位置权重 标签将会被保留。

2.2 setweight 函数

setwetight 函数将返回 tsvector 值,并且为每个 位置 标注权重(A、B、C、D,D是默认值,默认不会被显示)。

  1. 函数定义。
setweight(vector tsvector, weight "char") returns tsvector
  1. 查询示例。
SELECT setweight(fulltext,'A')  from film ;

//屏幕输出:
setweight
------------------------------------------------------------------
 'agent':10A 'brilliant':4A 'cat':18A 'charact':5A 'find':16A 'graffiti':2A 'gulf':21A 'man':13A 'mexico':23A 'must':15A 'secret':9A 'stranger':1A 'studi'
:6A
... ... ...  ...
SELECT setweight(fulltext,'D')  from film ;
 setweight
------------------------------------------------
 'agent':10 'brilliant':4 'cat':18 'charact':5 'find':16 'graffiti':2 'gulf':21 'man':13 'mexico':23 'must':15 'secret':9 'stranger':1 'studi':6
 'boat':22 

2.3 length 函数

  1. 语法定义。返回一个文档中 词位 的个数
length(_`vector`_ `tsvector`) returns `integer`
  1. 示例。
SELECT length(fulltext)  from film ;
//屏幕输出:

 length 
--------
     13
     13
... ... ... 
     12
     11
(1000 rows)

2.4 strip 函数

  1. 语法定义。此函数将返回一个去除 位置权重信息 tsvector
strip(_`vector`_ `tsvector`) returns `tsvector`
  1. 示例。
SELECT strip(fulltext) from film;
//屏幕输出:
strip
---------
 'agent' 'brilliant' 'cat' 'charact' 'find' 'graffiti' 'gulf' 'man' 'mexico' 'must' 'secret' 'stranger' 'studi'
 'boat' 'butler' 

3 查询(tsqurey)操作符和函数

查询解析介绍了创建 tsquery 值。PostgreSQL 提供更多了函数和运算符,用于操作 tsquery

3.1 tsquery && tsquery

&&AND 与的关系。表示两个查询都需要匹配。

3.2 tsquery || tsquery

||OR 或的关系。表示两个查询至少匹配一个。

3.3 !! tsquery

!!NOT 取非的关系。表示不匹配的查询。

3.4 tsquery <-> tsquery

tsquery 操作符 <->(FOLLOWED BY) 可以搜索短语是否匹配。注意它会忽略 停用词
例如 :fatrat 是紧挨着的。或者,fatcat 是紧挨着的 查询。可以表述为以下形式。

SELECT to_tsquery('fat') <-> to_tsquery('cat | rat');
//屏幕输出:
          ?column?           
-----------------------------
 'fat' <-> ( 'cat' | 'rat' )
(1 row)

3.5 tsquery_phrase

  1. 语法定义。返回一个 查询 术语。此 查询 将会包含两个词的之间的距离。
tsquery_phrase(query1 tsquery, query2 tsquery [, distance integer ]) returns tsquery
  1. 例如,单词 fatcat 相差10个单词的距离。
SELECT tsquery_phrase(to_tsquery('fat'), to_tsquery('cat'), 10);
//屏幕输出:
  tsquery_phrase  
------------------
 'fat' <10> 'cat'
(1 row)

3.6 numnode

  1. 语法定义。返回 tsquery 的有效匹配数量。可用于验证 tsquery 有效匹配数量。(如果返回数量<= 0 ,查询则无意义)。
numnode(query tsquery) returns integer
  1. 例如:返回结果为 0 情况
SELECT numnode(plainto_tsquery('the any'));
//屏幕输出:
NOTICE:  text-search query contains only stop words or doesn't contain lexemes, ignored
 numnode 
---------
       0
(1 row)
  1. 例如:返回结构为 3 情况。
SELECT numnode('foo & bar'::tsquery);
 numnode 
---------
       3
(1 row)

3.7 querytree

  1. 语法定义。返回可用于索引的 查询。此函数检测此查询是否支持索引扫描。
querytree(query tsquery) returns text
SELECT querytree(to_tsquery('defined'));
//屏幕输出:
 querytree
-----------
 'defin'
SELECT querytree(to_tsquery('!defined'));
//屏幕输出:
 querytree
-----------
 T

4 收集文档统计信息

ts_stat 函数对于检查 预定义配置停用词 的有效性非常有用。

4.1 语法大纲

ts_stat 函数通过 tsquery 检查 tsvector 中的统计信息。

返回值 说明
word 文档中出现的词位值,为text 类型。
ndoc 文档中包含此 词位 的文档数量,为 interger 类型。
nentry 在所有文档中 词位 出现的数量总数。
ts_stat(sqlquery text, [ weights text, ]
        OUT word text, OUT ndoc integer,
        OUT nentry integer) returns setof record

4.2 在文档集合中查找最常用的十个单词

SELECT * FROM ts_stat('SELECT fulltext FROM film')
ORDER BY nentry DESC, ndoc DESC, word
LIMIT 10;
//屏幕输出:
  word   | ndoc | nentry 
---------+------+--------
 must    | 1000 |   1000
 mad     |  165 |    176
 boat    |  158 |    167
 woman   |  136 |    142
 man     |  118 |    125
 ancient |  124 |    124
 shark   |  114 |    118
 abandon |  111 |    111
 drama   |  106 |    106
 display |  105 |    105
(10 rows)

4.3 在文档集合中查找权重为 AB 的词位统计信息

SELECT * FROM ts_stat('SELECT fulltext FROM film', 'ab')
ORDER BY nentry DESC, ndoc DESC, word
LIMIT 10;
 word | ndoc | nentry 
------+------+--------
(0 rows)
Note

由于 fulltext 文档中的词位没有权重值,所以这里搜索出来是 0 行。